/**
 * 大数乘法
 *
 * 描述
 * 以字符串的形式读入两个数字，编写一个函数计算它们的乘积，以字符串形式返回。
 *
 * 数据范围：
 * 读入的数字大小满足0≤n≤10^1000
 *
 * 要求：
 * 空间复杂度 O(m)，
 * 时间复杂度O(m^2)（假设m是n的长度）
 */

/**
 * 这一题相乘我们可以关注到相乘最后可以一起进位, 只要我们将乘出来
 * 的数加在对应的位置, 最后在一起进位就好了, 不论是两数相乘还是几个数
 * 都可以这样写. 我们正好数组的下标是每个数对应位置的和. 免去了我们去
 * 想办法映射
 * 时间复杂度 : O(n ^2)
 * 空间复杂度 : O(n)
 */

public class Main {
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     *
     * @param s string字符串 第一个整数
     * @param t string字符串 第二个整数
     * @return string字符串
     */
    public String solve (String s, String t) {

        // 长度
        int m = s.length() - 1, n = t.length() - 1;

        // 数组, 因为两个数相乘结果的长度不会超过两个数长度和
        int[] nums = new int[m + n + 2];

        // 这个用来处理下面的变位
        int m1 = m, n1 = n;

        // 进位
        while (n1 >= 0) {

            // 取 t 的每一位
            int a = t.charAt(n1) - '0';

            // 与 s 的每一位相乘
            while (m1 >= 0) {

                int b = s.charAt(m1) - '0';

                // 乘出来的结果直接加入对应位置的数组中
                nums[n1 + m1 + 1] += a * b;

                // 这里要注意下标变化, 还要在 nums 赋值之后
                m1--;
            }

            // 这里的下标变化也要在 nums 赋值之后
            n1--;

            // m1 恢复乘原来的 m
            m1 = m;
        }

        // 开始处理数组中的数
        // 进位标志
        int tmp = 0;
        for (int i = m + n + 1; i >= 0; i--) {

            // 加上进位
            nums[i] += tmp;

            // 进位
            tmp = nums[i] / 10;

            // 本位置的最终数
            nums[i] %= 10;
        }

        // 拼接函数
        StringBuffer res = new StringBuffer();

        // 处理前导 0
        int i = 0;
        for (; i < m + n + 2; i++) {
            if (nums[i] != 0) {
                break;
            }
        }

        // 拼接数字
        for (; i < m + n + 2; i++) {
            res.append(nums[i]);
        }

        // 要是没有长度, 结果就是 0
        if (res.length() == 0) {
            res.append(0);
        }

        // 转化为字符
        return res.toString();
    }
}